iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 24
0
Modern Web

Nest.js framework 30天初探系列 第 24

Nestjs framework 30天初探:Day24 Mixin Class

  • 分享至 

  • xImage
  •  

Mixin Class

Mixin(混入),主要是拿來解決多重繼承的問題,類跟類的繼承關係可能挺複雜,繼承順序也可能很亂,遇到繼承的父類們剛好有同樣的方法名稱時就更雷了!
這時Mixin class就很好用了,繼承強調的是關係,Mixin強調的是功能,我只需要某類的功能,就Mixin一下,解決了多重繼承問題。
TypeScript2.2版出爐後,新增支持Mixin class功能,nestjs作者強調nestjs框架不容易傳遞一個參數到某程式區塊像Interceptors和Guards等,但可以透過mixin class方式達成目的。

  1. 請複製day09專案
    cmd指令
npm install
  1. 修改一下cache.interceptor.ts,讓isCached變成抽象類別受保護的成員。
    src/modules/Shared/Interceptors/cache.interceptor.ts

import { Interceptor, NestInterceptor, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

@Interceptor()
export abstract class CacheInterceptor implements NestInterceptor {
  protected abstract readonly isCached: () => boolean;
  intercept(): Observable<any> {
    if (this.isCached()) {
      return Observable.of([{ "data": "isCached true" }]);
    }
    return Observable.of([{ "data": "isCached false" }]);
  }
}
  1. 先前已經準備好了cache.interceptor.ts,這次新增一下mixin-cache.interceptor.ts。
    src/modules/Shared/Interceptors/mixin-cache.interceptor.ts
import { mixin } from '@nestjs/common';
import { CacheInterceptor } from './cache.interceptor';

export function mixinCacheInterceptor(isCached: () => boolean) {
    return mixin(class extends CacheInterceptor {
        protected readonly isCached = isCached;
    })
}

mixin是方法不實例化,這邊透過傳參改變isCached的值。

  1. 在UsersController裡新增testMixinClass()。
    src/modules/Users/users.controller.ts
    @Get('testMixinClass')
    @UseInterceptors(mixinCacheInterceptor(() => false))
    async testMixinClass() {
        return "test mixin class";
    }

可以傳入false參數,讓mixinCacheInterceptor去賦予isCached值。
5.1 實測一下,對http://localhost:3000/testMixinClass 做GET請求。@UseInterceptors(mixinCacheInterceptor(() => false))
https://ithelp.ithome.com.tw/upload/images/20171227/201071956lDfI9XAsm.png
5.2 實測一下,對http://localhost:3000/testMixinClass 做GET請求。@UseInterceptors(mixinCacheInterceptor(() => true))
https://ithelp.ithome.com.tw/upload/images/20171227/20107195Uj6Qzps4Ic.png

透過mixin class,mixinCacheInterceptor得到了CacheInterceptor的成員,而mixinCacheInterceptor本身是方法,方法傳參還蠻容易的,這樣方式就避免多重繼承的可能問題又可以得到class的成員或方法來使用,有時候需要某class的方法時,用這招還挺不錯的。

程式碼都在github


上一篇
Nestjs framework 30天初探:Day23 Redis
下一篇
Nestjs framework 30天初探:Day25 Provider
系列文
Nest.js framework 30天初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言